Subject 是一種特殊的 Publisher, protocol Subject
是 protocol Publisher
的繼承類:
protocol Subject : AnyObject, Publisher
Subject.send()
Subject.send(subscription:)
Subject.send(completion:)
特別注意, 不同於 Publisher, Subject 透過 AnyObjcet
, 限制了 Reference type.
如果 一個事件流要用特別的方式介入, Suject 就是這個 inject
的載體, 也因此可以快速的將原本的非 Combine 的程式改寫套用. 若是熟係設計模式, Subject 以實作觀察者模式來理解會比較直接.
Subject 在 Combine 有兩個實作類別:
final class PassthroughSubject<Output, Failure> where Failure : Error
final class CurrentValueSubject<Output, Failure> where Failure : Error
PassthroughtSubject 的文件很簡易的解釋他與 CurrentValueSubject
的差別
Unlike
CurrentValueSubject
, a PassthroughSubject doesn’t have an initial value or a buffer of the most recently-published element.
PassthroughSubject 和 CurrentValueSubject 幾乎一樣,只是沒有初始值,也不會保存任何值。
PassthroughSubject 是一個相近於 NotificationCenter
的模式, 透過 .send()
可以控制結束或是發送 Value, 很容易入門且濫用.
CurrentValueSubject 相對於 PassthroughSubject, 是沒有.send()
, 取而代之的是一個真真確確的 value, 就像是 didSet
的方式, 就像 if then 的方式.
簡單測驗:
IntNeverPassthroughSubject
(提示 final class
)